package com.hliushi.item.canal;

import com.github.benmanes.caffeine.cache.Cache;
import com.hliushi.item.config.RedisHandler;
import com.hliushi.item.pojo.ItemStock;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import top.javatool.canal.client.annotation.CanalTable;
import top.javatool.canal.client.handler.EntryHandler;

import javax.annotation.Resource;

/**
 * @author llhuang10
 * @date 2021/9/20 15:59
 */
@Slf4j
@Component
@CanalTable("tb_item_stock")  // 指定要监听的表
public class ItemStockHandler implements EntryHandler<ItemStock> {


    @Resource
    private RedisTemplate<String, Object> redisTemplate;

    @Resource
    private Cache<Long, ItemStock> itemStockCache;


    @Override
    public void insert(ItemStock itemStock) {
        // 写数据到JVM进程缓存   --> 先写JVM进程缓存, 效率比redis高
        itemStockCache.put(itemStock.getId(), itemStock);
        // 写数据到redis
        redisTemplate.opsForValue().set(RedisHandler.ITEM_STOCK_KEY + itemStock.getId(), itemStock);
    }

    /**
     * 对于更新操作来讲
     * before中的属性只包含变更的属性
     * after包含所有属性, 通过对比可发现哪些属性更新了
     *
     * @param before
     * @param after
     */
    @Override
    public void update(ItemStock before, ItemStock after) {
        // 写数据到JVM进程缓存   --> 先写JVM进程缓存, 效率比redis高

        // bug点, 由于 实体ItemStock中的主键字段和DB中注解字段名称不一致, 只用了mp的注解标识了两者不一致的情况, 而没用jpa的去标识
        // 导致这里没有取到 id
        // ========= before: ItemStock(id=null, stock=99996, sold=null),  after: ItemStock(id=null, stock=99997, sold=3219)
        log.info("========= before: {},  after: {}", before, after);

        // itemStockCache.put(after.getId(), after);
        // 写数据到redis
        redisTemplate.opsForValue().set(RedisHandler.ITEM_STOCK_KEY + after.getId(), after);

    }

    @Override
    public void delete(ItemStock itemStock) {
        // 删除数据到JVM进程缓存
        itemStockCache.invalidate(itemStock.getId());
        // 删除数据到redis
        redisTemplate.delete(RedisHandler.ITEM_STOCK_KEY + itemStock.getId());
    }
}
